package main

import "fmt"

//运算符
func main() {

	//算术运算符
	var i int = 9 / 3

	var f float64 = 10 / 4

	fmt.Printf("int 9/3==%v\n", i)
	fmt.Printf("float 10/4==%v\n", f)
	fmt.Println(10 / 4)

	var f2 float64 = float64(10) / 4
	fmt.Printf("float 10/4==%v\n", f2)

	fmt.Println("10%3=", 10%3)
	fmt.Println("-10%3=", -10%3)   //=-10-(-10)/3*3=-10-(-9)=-1
	fmt.Println("10%-3=", 10%-3)   //10-(10)/3*3=10-9=1
	fmt.Println("-10%-3=", -10%-3) //=-10-(-10)/3*3=-10-(-9)=-1

	//赋值运算符
	var ii int = 10
	ii++
	fmt.Println("ii=", ii)
	ii++
	fmt.Println("ii=", ii)
	fmt.Println("ii=", ii)

	ii += 12
	fmt.Println("ii+=", ii)
	ii -= 12
	fmt.Println("ii-=", ii)
	ii /= 2
	fmt.Println("ii/=", ii)
	ii *= 2
	fmt.Println("ii*=", ii)

	ii = ii + 12
	fmt.Println("ii=", ii)

	//自增的不能做比较

	//比较运算符
	var n1 int = 9
	var n2 int = 8

	fmt.Println(n1 == n2)
	fmt.Println(n1 > n2)
	fmt.Println(n1 < n2)
	fmt.Println(n1 >= n2)
	fmt.Println(n1 <= n2)

	//逻辑运算符

	var age int = 40
	if age > 30 && age < 50 {
		fmt.Println("ok1")
	}

	if age > 30 && age < 40 {
		fmt.Println("ok2")
	}

	if age > 30 || age < 50 {
		fmt.Println("ok3")
	}

	if age > 30 || age < 40 {
		fmt.Println("ok4")
	}

	fmt.Println(!true)

	if age > 30 {
		fmt.Println("age==", age)
	}

	if !(age > 30) {
		fmt.Println("age==", age)
	}

	if age > 30 && test() {
		fmt.Println("age", age)
	}

	fmt.Println("|||||||||||||||")
	if age > 30 || test() {
		fmt.Println("age", age)
	}
	//位运算符
	//按位与 & 两者同时是一 结果一
	//按位或 | 其中一个是一 结果一
	//按位异或 ^ 两位一个为零 一个为一 结果一 否则结果零

	//0000 0010
	//0000 0011
	//0000 0010
	fmt.Println("a&3", 2&3)
	//0000 0010
	//0000 0011
	//0000 0011
	fmt.Println("a|3", 2|3)
	//0000 0010
	//0000 0011
	//0000 0001
	fmt.Println("a^3", 2^3)

	// -2原码 1000 0010 =>反码 1111 1101 =>补码 1111 1110
	// 原码 左边第一位数 是1
	// 原码=>反码 除去第一位 其他取反
	// 反码=>补码 +1
	//			1111 1110
	// 2的补码   0000 0010
	//			1111 1100

	// -2^2  1111 1100 (补码)=>原码

	//1111 1100(补码)=> 1111 1011 (反码)=> 1000 0100(原码)

	// -2^2 等于-4
	fmt.Println("-2^2", -2^2)

	//移位运算符

	//0000 0010
	//0000 0100
	fmt.Println("2<<1", 2<<1)
	//0000 0010
	//0000 0001
	fmt.Println("2>>1", 2>>1)

	// 1000 0100
	// 1000 0010
	fmt.Println("-4>>1", -4>>1)
	// 1000 0100
	// 1000 1000
	fmt.Println("-4<<1", -4<<1)

	fmt.Println("1>>4", 1>>4)

	//其他运算符
	// * &
	a := 100
	fmt.Println("a的地址", &a)
	var par *int = &a
	fmt.Println("par指向的值", *par)

}

func test() bool {
	fmt.Println("test ***")
	return true
}
